#include <iostream>

class AbstractDrinking
{
public:
    virtual void Boil() = 0;
    virtual void Brew() = 0;
    virtual void PourInCup() = 0;
    virtual void PutSomething() = 0;

    void makeDrink()
    {
        Boil();
        Brew();
        PourInCup();
        PutSomething();
    }
};

class Coffee : public AbstractDrinking
{
public:
    void Boil()
    {
        std::cout << "boil water" << std::endl;
    }
    void Brew()
    {
        std::cout << "brew coffee" << std::endl;
    }
    void PourInCup()
    {
        std::cout << "pour in cup" << std::endl;
    }
    void PutSomething()
    {
        std::cout << "add sugar" << std::endl;
    }
};

class Tea : public AbstractDrinking
{
public:
    void Boil()
    {
        std::cout << "boil water" << std::endl;
    }
    void Brew()
    {
        std::cout << "brew tea" << std::endl;
    }
    void PourInCup()
    {
        std::cout << "pour in cup" << std::endl;
    }
    void PutSomething()
    {
        std::cout << "add lemon" << std::endl;
    }
};

void test01()
{
    Coffee coffee;
    coffee.makeDrink();
    Tea tea;
    tea.makeDrink();
}

int main()
{
    test01();
    return 0;
}